package algo3c3g3.model.action;

import algo3c3g3.model.*;
import org.jdom.Element;

import algo3c3g3.model.persistence.Persistence;

/**
 * Debe activarse cuando la unidad no tiene un bloque solido debajo.
 * La unidad cae. Si supera la altura maima de caida es destruida
 * al tocar el piso.
 */
public class Faller extends Action
{
    private int blockCount;
    
    private static final int MAX_SAFE_HEIGHT = 8;
    
    public void perform(Unit unit)
    {
        // No toco el piso. Cae y cuenta un bloque de caida.
        if(unit.overSolidFloor() == false)
        {
            unit.fall();
            blockCount++;
            return;
        }
        
        // Toco el piso. Si paso la altura maxima se elimina
        if(blockCount >= MAX_SAFE_HEIGHT)
            unit.kill();
        // No paso la altura maxima. Vuelve a ser Walker.
        else
        {
            unit.setAction(new Walker());
            unit.materialEffectY();
            unit.materialEffectX();
        }
    }
    
    // Esto es solo para mostrar cuando se cambia de accion.
    public Faller()
    {
        //System.out.println("\nAccion cambiada a Faller\n");
    }
    
    @Override
    public Element save()
    {
        Element root = super.save();

        Element e = new Element("blockCount");
        e.addContent(Integer.toString(this.blockCount));
        root.addContent(e);

        return root;
    }

    @Override
    public void load(Element e)
    {
        this.blockCount =
            new Integer(e.getChildText("blockCount")).intValue();
    }

    
    
    public static void main(String[] args)
    {
        System.out.println();
        
        World world = new World(new Coord(1, 2), null, new TestMaps.TestFallerMap());
        
        System.out.println("Mapa:");
        world.printMap();
        
        world.addUnit();
        
        Unit unit1 = world.getUnit(0);
        
        System.out.println("\nNueva unidad:");
        unit1.printStatus();
        
        System.out.println("\nCaminando hacia la derecha:");
        for(int i = 0; i < 20; i++)
        {
            world.moveUnits();
            unit1.printStatus();
        }
        
        System.out.println();
        
        Persistence.toXMLFile(new Faller().save(),"C:\\salida.xml");
    }
}
